use std::sync::mpsc::SyncSender;

use glam::DVec3;

use crate::*;

pub fn demo2(tx: SyncSender<(usize, DVec3)>) -> (Renderer, Box<dyn Hitable>) {
    let mut scene = Hitables::default();

    let tex_ground = TexChecker::from_color(0.3, dvec3(0.2, 0.3, 0.1), dvec3(0.9, 0.9, 0.9));
    let mat_ground = LambertMaterial::from_texture(tex_ground);

    let mat_center = LambertMaterial::new(dvec3(0.1, 0.2, 0.5));
    let mat_left = DielectricMaterial::new(1.5);
    let mat_bubble = DielectricMaterial::new(1.0 / 1.5);
    let mat_right = MetalMaterial::new(dvec3(0.8, 0.6, 0.2), 1.0);

    // create sphere objects
    scene.add(Sphere::new(DVec3::new( 0.0, -100.5, -1.0), 100.0, mat_ground));
    scene.add(Sphere::new(DVec3::new( 0.0,    0.0, -1.2),   0.5, mat_center));
    scene.add(Sphere::new(DVec3::new(-1.0,    0.0, -1.0),   0.5, mat_left));
    scene.add(Sphere::new(DVec3::new(-1.0,    0.0, -1.0),   0.4, mat_bubble));
    scene.add(Sphere::new(DVec3::new( 1.0,    0.0, -1.0),   0.5, mat_right));

    let renderer = RendererBuilder::new(tx)
        .camera(
            dvec3(-2.0, 2.0, 1.0),
            dvec3(0.0, 0.0, -1.0),
            dvec3(0.0, 1.0, 0.0),
            90.0,
        )
        .max_depth(10)
        .sample_count(10)
        .build();

    (renderer, Box::new(BVHNode::from(scene)))
}
